from file_manage import models
from django.contrib import messages

from django.shortcuts import redirect,reverse,get_object_or_404,HttpResponse


from xml.dom import minidom
import hashlib
import os
import uuid
import re


# def handle_repetitive_file(file):
#     """
#         处理同名的或者重复的文件
#         file: File object
#
#         通过遍历看是否有重复路径，如果有重复，则返回带序号的 path
#     """
#
#     # 同一个用户的重名文件，与 digest 无关
#     # 重名文件自动命名_1_2_3
#     if models.File.objects.filter(owner=file.owner, path=file.path, name=file.name).count() > 1:
#         base, ext = os.path.splitext(file.name)
#
#         file.name = '{}_{}{}'.format(base, file.pk, ext)
#         file.save()
#
#     models.Link.add_one(file)

def handle_uploaded_files(files, owner, directory,request):
    """
        files: 接收到来自用户上传的一组文件
        owner: 用户的 user 对象
        directory: 用户上传文件时所在的目录

        先给一个随机名字，然后一边接收，一边 hash，
        最后用 hash 值来命名文件

        1.同一个文件夹存在的相同文件
        2.不同文件夹下存在的相同文件

    """
    # import pdb; pdb.set_trace()
    media_dir = models.get_media_abspath() # 所有文件的绝对路径  File_manage

    for file in files:
        digest = hashlib.sha1()  #创建sha1对象
        temp_filename = os.path.join(media_dir, str(uuid.uuid1())) #　临时文件   uuid1 根据时间戳和机器信息计算得出 uuid4还是uuid1？实际存储依然用的是sha1值
        if not os.path.isdir(temp_filename):
            os.makedirs(temp_filename)
        tmp_path=os.path.join(temp_filename,files[0]._name)

        #上传方法：
        #先用uuid1生成唯一文件夹，然后再将文件夹改为sha1的值
        with open(tmp_path, 'wb+') as destination:

            for chunk in file.chunks(chunk_size=1024):
                destination.write(chunk)
                destination.flush()
                digest.update(chunk)

        digest = digest.hexdigest()  # hash 对象转十六进制字符串
        abspath = os.path.join(media_dir, digest) # 服务器路径，用于储存
        if models.File.objects.filter(owner=owner,digest=digest,path=directory.path):
            # 同一个文件夹下如果有重复文件的时候
            tmp = models.File.objects.filter(owner=owner, digest=digest, path=directory.path)
            os.remove(tmp_path)
            os.rmdir(temp_filename)
            messages.error(request,'该目录下有相同的文件！（该文件名:{name}）'.format(name=tmp[0].name))
            return False
        elif models.File.objects.filter(owner=owner,digest=digest) or os.path.exists(abspath):
            # 1.不同文件夹下如果有相同文件的时候(link数加1，数据库录入，文件删除）  2.如果服务器上有数据 但数据库中没有的时候
            # tmp_file=models.File.objects.filter(owner=owner, digest=digest)
            os.remove(tmp_path)
            os.rmdir(temp_filename)
            file = models.File.objects.create( # 返回 file 对象
                name = re.sub(r'[%/]', '_', file.name), # 给用户看的名字，去掉正斜杠和百分号，just in case
                owner = owner,
                parent = directory,
                digest = digest,    # 服务器上真正的名字 sha1值
                path = directory.path, # 用户路径，用户给用户展示，不包含文件名
                size = file.size,   #文件大小

            )
            # file.email_data.add()
            models.Link.add_one(file)
            return True
        # elif os.path.exists(abspath):
        #     os.remove(tmp_path)
        #     os.rmdir(temp_filename)
        #     #如果服务器上有数据 但数据库中没有的时候
        #     file = models.File.objects.create(  # 返回 file 对象
        #         name=re.sub(r'[%/]', '_', file.name),  # 给用户看的名字，去掉正斜杠和百分号，just in case
        #         owner=owner,
        #         parent=directory,
        #         digest=digest,  # 服务器上真正的名字 sha1值
        #         path=directory.path,  # 用户路径，用户给用户展示，不包含文件名
        #         size=file.size,  # 文件大小
        #     )
        #     models.Link.add_one(file)
        #     # handle_repetitive_file(file)
        #     return True
        else:#新文件的时候
           #上传文件后创建file对象(link数加1，数据库录入，文件保存）
            file = models.File.objects.create( # 返回 file 对象
                name = re.sub(r'[%/]', '_', file.name), # 给用户看的名字，去掉正斜杠和百分号，just in case
                owner = owner,
                parent = directory,
                digest = digest,    # 服务器上真正的名字 sha1值
                path = directory.path, # 用户路径，用户给用户展示，不包含文件名
                size = file.size,   #文件大小
            )
            # #此时有可能sha1值有相同的
            os.rename(temp_filename, abspath)
            models.Link.add_one(file)
            # handle_repetitive_file(file)
            return True
import os
def get_file_path(file):
    """
    传入models file  返回该文件的位置
    :param file:
    :return:
    """
    for root, dirs, files in os.walk(file.get_full_path()):
        tmp_path = os.path.join(file.get_full_path(), files[0])
    return tmp_path


import manage
def task_condition(pk):
    """
    查看该任务是否在task_condition内
    :param pk: 文件主键
    :return:返回id号
    """
    from file_manage.views import scheduler
    list_tmp=scheduler.get_jobs()
    for tmp in list_tmp:
        if(tmp.args[0]==pk):
            return tmp.id
    return False
import time
from Auto_Code import main
from Method_Decorate import zip_file
from Method_Decorate import Inside_action

# app_num_path={0:None,"JULONG":"Src_Code\\APP_work\\ccm_auto_test\\app_x86"}
file_folder = "/Tmp_File"
"""小文件夹"""
S_folder="/Gen_S_Yaml"
T_folder="/Collection_S_Yaml"
T_folder_gen="/Gen_T_Yaml"
report_folder="/Report_File"
zip_folder="/zipfile"

def time_middlesite_task(pk,user_name):
    """
    时间到了后执行 去访问to_gen_process
    :return:todo:太过冗余 很多可以直接用数据库的东西实现
    """
    from file_manage.views import scheduler
    file=get_object_or_404(models.File,pk=pk)
    if task_condition(pk): #定时任务的情况7
        tmp_dic={}
        tmp_dic['main_process']={}
        tmp_dic['tmp_time'] = time.strftime("%Y-%m-%d_%H_%M_%S")
        tmp_dic['base_path'] = os.path.abspath(
            (os.path.join(os.getcwd(), "..")) + file_folder + report_folder)
        tmp_dic['main_process']['app_path'] = file.app_path
        tmp_dic['main_process']['report_path'] = tmp_dic['base_path'] + "/" + tmp_dic[
            'tmp_time']
        tmp_dic['main_process']['Total_case_path'] = get_file_path(file)
        fail_num=main.Auto_process(tmp_dic['main_process'],pk)
        # 压缩文件名
        file_name = tmp_dic['tmp_time'] + "_report" + ".zip"
        # 输出压缩的文件夹
        zip_path = tmp_dic['base_path'] + zip_folder
        if not zip_path:
            os.makedirs(zip_path)
        # 压缩文件名
        need_compress = tmp_dic['main_process']['report_path']
        zip_path_name = os.path.join(zip_path, file_name)
        # 压缩文件
        zip_file.compress_file(need_compress, zip_path_name)
        # 最终输出为
        path_case = os.path.join(zip_path, file_name)
        Inside_action.send_emial_appendix(user_name,path_case,file,fail_num)
        Inside_action.up_load_to_file_manage(user_name, path_case, "report")
        # scheduler.remove_job(job_id=task_condition(pk))
    # file_database = get_object_or_404(models.File, pk=pk)
    return


class xml_method():
    @staticmethod
    def read_xml_dom_root(app_path):
        """
        读取xml信息转化为dom树
        :param app:
        :return: 返回dom树
        """
        # models.App.objects
        # app_path=app.app_path
        xml_path="xml/system_parameter.xml"
        read_xml_path=os.path.join(app_path,xml_path)
        #读取xml树
        dom=minidom.parse(read_xml_path)
        return dom

    @staticmethod
    def get_app_xml_information_switch(app_path):
        """
        1.20
        获得appxml的开关信息
        :param app_path: app路径
        :return:
        """
        dom=xml_method.read_xml_dom_root(app_path)
        #获取根节点
        root=dom.documentElement
        global_setting=root.getElementsByTagName('Global_Parameter_Setting')[0]
        xml_switch_dic = {}
        for tmp in global_setting.childNodes:
            if not isinstance(tmp,minidom.Text):
                xml_switch_dic.update({tmp.getAttribute('Chinesesimple'):tmp.getAttribute('current_inherit')})
        return xml_switch_dic


    @staticmethod
    def set_app_xml_infomation_switch(app_path,xml_switch_dic):
        """
        1.20
        设置app_xml开关信息
        :param app_path:
        xml_switch_dic:设置的结果 xml最终的结果  {中文名:true 或者 false}
        :return:
        """
        dom=xml_method.read_xml_dom_root(app_path)
        #获取根节点
        root=dom.documentElement
        global_setting=root.getElementsByTagName('Global_Parameter_Setting')[0]
        for tmp in global_setting.childNodes:
            if not isinstance(tmp,minidom.Text):
                if tmp.getAttribute('Chinesesimple') in xml_switch_dic:
                    tmp.setAttribute('current_inherit', xml_switch_dic[tmp.getAttribute('Chinesesimple')])

        with open('system_parameter.xml', 'r+', encoding='utf8') as fh:
            dom.writexml(fh, encoding='UTF-8')





